import { ChatRecord } from '@/interface'
import { formatTime } from '@/utils'
import dayjs from 'dayjs'

/**
 * 对Date的扩展，将 Date 转化为指定格式的String。
 *
 *  月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
 *  年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)。
 *
 *  【示例】：
 *  common.formatDate(new Date(), 'yyyy-MM-dd HH:MM:ss.S') ==> 2006-07-02 08:09:04.423
 *  common.formatDate(new Date(), 'yyyy-M-d h:m:s.S')      ==> 2006-7-2 8:9:4.18
 *  common.formatDate(new Date(), 'HH:MM:ss.S')            ==> 08:09:04.423
 */
const _formatDate = function (date: Date, fmt: string) {
	return dayjs(date).format(fmt)
}
/**
 * 仿照微信中的消息时间显示逻辑，将时间戳（单位：毫秒）转换为友好的显示格式.
 *
 * 1）7天之内的日期显示逻辑是：今天、昨天(-1d)、前天(-2d)、星期？（只显示总计7天之内的星期数，即<=-4d）；
 * 2）7天之外（即>7天）的逻辑：直接显示完整日期时间。
 *
 * @param  {[long]} dateTime 时间戳（单位：毫秒），形如：1550789954260
 * @param {boolean} mustIncludeTime true表示输出的格式里一定会包含“时间:分钟”
 * ，否则不包含（参考微信，不包含时分的情况，用于首页“消息”中显示时）
 * @return {string} 输出格式形如：“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式
 */
export function _getTimeStringAutoShort2(dateTime: string, mustIncludeTime: boolean) {
	// 当前时间

	const currentDate = new Date()
	// 目标判断时间
	const srcDate = new Date(dateTime)
	const timestamp = dayjs(dateTime).unix() * 1000
	const currentYear = currentDate.getFullYear()
	const currentMonth = currentDate.getMonth() + 1
	const currentDateD = currentDate.getDate()

	const srcYear = srcDate.getFullYear()
	const srcMonth = srcDate.getMonth() + 1
	const srcDateD = srcDate.getDate()

	let ret = ''

	// 要额外显示的时间分钟
	const timeExtraStr = mustIncludeTime ? ' ' + _formatDate(srcDate, 'HH:MM') : ''
	// 当年
	if (currentYear == srcYear) {
		const currentTimestamp = currentDate.getTime()
		const srcTimestamp = timestamp as number
		// 相差时间（单位：毫秒）
		const deltaTime = currentTimestamp - srcTimestamp

		// 当天（月份和日期一致才是）
		if (currentMonth == srcMonth && currentDateD == srcDateD) {
			// 时间相差60秒以内
			if (deltaTime < 60 * 1000) ret = '刚刚'
			// 否则当天其它时间段的，直接显示“时:分”的形式
			else ret = _formatDate(srcDate, 'HH:MM')
		}
		// 当年 && 当天之外的时间（即昨天及以前的时间）
		else {
			// 昨天（以“现在”的时候为基准-1天）
			const yesterdayDate = new Date()
			yesterdayDate.setDate(yesterdayDate.getDate() - 1)

			// 前天（以“现在”的时候为基准-2天）
			const beforeYesterdayDate = new Date()
			beforeYesterdayDate.setDate(beforeYesterdayDate.getDate() - 2)

			// 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较，是最为准确的（如果用时间戳差值
			// 的形式，是不准确的，比如：现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00，
			// 这两者间只相差2小时，直接用“deltaTime/(3600 * 1000)” > 24小时来判断是否昨天，就完全是扯蛋的逻辑了）
			if (srcMonth == yesterdayDate.getMonth() + 1 && srcDateD == yesterdayDate.getDate())
				ret = '昨天' + timeExtraStr // -1d
			// “前天”判断逻辑同上
			else if (srcMonth == beforeYesterdayDate.getMonth() + 1 && srcDateD == beforeYesterdayDate.getDate())
				ret = '前天' + timeExtraStr // -2d
			else {
				// 跟当前时间相差的小时数
				const deltaHour = deltaTime / (3600 * 1000)

				// 如果小于或等 7*24小时就显示星期几
				if (deltaHour <= 7 * 24) {
					const weekday = new Array(7)
					weekday[0] = '星期日'
					weekday[1] = '星期一'
					weekday[2] = '星期二'
					weekday[3] = '星期三'
					weekday[4] = '星期四'
					weekday[5] = '星期五'
					weekday[6] = '星期六'

					// 取出当前是星期几
					const weedayDesc = weekday[srcDate.getDay()]
					ret = weedayDesc + timeExtraStr
				}
				// 否则直接显示完整日期时间
				else ret = _formatDate(srcDate, 'YYYY/MM/DD') + timeExtraStr
			}
		}
	}
	// 往年
	else {
		ret = _formatDate(srcDate, 'YYYY/MM/DD') + timeExtraStr
	}

	return ret
}
/**
 * 聊天时间格式化
 * 规则：
 *  1. 每五分钟为一个跨度
 *  2. 今天显示，小时:分钟，例如：11:12
 *  3. 昨天显示，昨天 小时:分钟 例如：昨天 11:12
 *  4. 一周内显示，星期几 小时:分钟 例如：星期四 11:12
 *  5. 日期差大于一周显示，年月日 小时:分钟 例如：2021年9月30日 11:12
 * @param currentMessageList 传入的当前会话数组
 * @param sort 传入数组排序：0-数组时间倒序；1-数组时间正序
 * @param type 五分钟规则区分：0-永远跟上一个显示的时间对比是否超5分钟 ；1-永远两条消息对比是否超5分钟
 * @returns {Array|null}
 */
export function msgTimeFormat(currentMessageList: ChatRecord[], sort: any, type: any) {
	const newMessageList: ChatRecord[] = []
	const currentFilterList = currentMessageList.filter((item) => {
		return !item.isCompare
	})
	currentFilterList.forEach((item, index: number) => {
		const date = item.createDate as string
		let showTime
		if (index === 0) {
			//第一条必显示时间
			showTime = formatTime(date)

			newMessageList.push({
				content: showTime,
				isCompare: true, //超五分钟显示时间-标识
				createDate: String(dayjs(item.createDate).unix()),
			})
			newMessageList.push(item as any)
		} else if (index <= currentFilterList.length - 1) {
			const current = dayjs(currentFilterList[index].createDate).unix()
			let minutes
			const showTimeList = newMessageList.filter((item) => {
				return item.isCompare
			})
			const lastShowTime = showTimeList[showTimeList.length - 1].createDate //添加的时间且最后一条，用于对比
			if (type) {
				const prev = dayjs(currentFilterList[index - 1].createDate).unix()
				minutes = (current - prev) / 60
			}
			if (!sort) {
				minutes = (current - Number(lastShowTime)) / 60
			} else {
				minutes = (Number(lastShowTime) - current) / 60
			}
			//超五分
			if (minutes > 5) {
				showTime = formatTime(date)
				newMessageList.push({
					content: showTime,
					isCompare: true, //超五分钟显示时间-标识
					createDate: String(dayjs(item.createDate).unix()),
				})
				newMessageList.push(item as any)
			} else {
				newMessageList.push(item as any)
			}
		}
	})
	// console.log('最后得到的数组', newMessageList)
	return newMessageList
}
